#ifndef __UBT_MESSAGE_MANAGER__
#define __UBT_MESSAGE_MANAGER__

#include <string>
#include <jsoncpp/json/json.h>

#include "config.h"
#include "ubt_yaml_config.h"
#include <ubt_mqtt/node.h> 

namespace ubt
{

class CMessageManager
{
public:
    CMessageManager();
    virtual ~CMessageManager();

    /**
     * @brief 打包心跳数据包
     */
    std::string PackHeartBeatMessage();

    /**
     * @brief 打包 agv 状态信息数据
     * @param status : agv 各模块状态
     * @return std::string
     */
    std::string PackAgvStatusMessage(const std::vector<int16_t>& status);

    /**
     * @brief 打包告警消息
     * @param info : 模块告警信息
     * @return std::string
     */
    std::string PackAgvDiagWarnMessage(const std::string& info);

    std::string PackEventMessageData(const Json::Value &data);


    /**
     * @brief 打包状态数据
     * @param stateJson : 状态json对象
     * @param duration ：当前状态的持续时间
     * @param cpuratio ：当前cpu0占用百分比
     * @return std::string
     */
    std::string PackStateStatusMessage(const Json::Value& stateJson, int duration, double cpuratio);

    /**
     * @brief 打包任务状态数据
     * @param requestid 　　 当前任务请求id
     * @param success      请求状态
     * @param message    当前任务状态信息
     * @return std::string
     */
    std::string PackTopicRequestMessage(const std::string &requestid, bool success, std::string &message);

    /**
     * @brief 打包任务状态数据
     * @param requestid 　　 当前任务请求id
     * @param taskstatus    当前任务状态信息
     * @return std::string
     */
    std::string PackTaskStatusMessage(const std::string &requestid, const Json::Value &taskstatus);

    /**
     * @brief 打包当前坐标信息
     * @param realpose 当前坐标（经过转换后的坐标）
     * @param confidence ：地图置信度
     * @return std::string
     */
    std::string PackLocalizationMessage(const location_pose_t &realpose, float confidence);

    /**
     * @brief 打包当前电量信息
     * @param data 转换过的电量信息data["perpower"]
     * @return std::string
     */
    std::string PackBatteryDataMessage(const Json::Value& data);

     /**
     * @brief 打包当前wifi信息
     * @param data 打包好的wifi相关信息
     * @return std::string
     */
    std::string PackWifiDataMessage(const Json::Value& data);

    /**
     * @brief 打包速度．里程数据
     * @param linearspeed   : 线速度
     * @param anngularspeed ：角速度
     * @param totalodom     : 总里程
     * @param totaltime     : 运行总时间
     * @return std::string
     */
    std::string PackSpeedMessage(float linearspeed, float anngularspeed, float totalodom, float totaltime);

    /**
     * @brief 打包急停/防撞条后取消任务反馈信息
     * @param cmd 命令
     * @return std::string
     */
    std::string PackRestDispatchMessage(const std::string& cmd);

    /**
     * @brief 打包请求回复的消息
     * @param responseid
     * @param status : 请求处理的状态
     * @param errmsg : 请求处理的状态描述
     * @return std::string
     */
    std::string PackResponseMessage(const std::string &responseid, bool status, std::string errmsg);

    /**
     * @brief 打包发布的task信息
     * @param mapinfo
     * @param taskinfo
     * @return std::string
     */
    std::string PackTaskMessage(const map_origin_info_t& mapinfo, const task_info_t &taskinfo, const std::string& version);

    /**
     * @brief 打包回复请求获取培训信息的包
     * @param responseid: 回复id
     * @param config : 配置信息json格式
     * @return std::string
     */
    std::string PackRequsetConfigMessage(const std::string &responseid, const Json::Value& config);

    std::string PackUpdateMapMessage(const std::string &responseid, const Json::Value& data);
    
        /**
     * @brief 打包地图数据
     * @param base64data : 地图转base64数据
     * @param height : 地图高
     * @param width  : 地图宽
     * @return std::string 
     */
    std::string PackMapImageMessage(const std::string &base64data, int height, int width, const location_pose_t& maporigin);

    /**
     * @brief 打包实时到点信息
     * @param infos : 站点信息
     * @return std::string 
     */
    std::string PackDispatchInfoMessage(const std::vector<int16_t> &infos);

    /**
     * @brief 打包本体各模块版本信息 (ros．电源板．电机)
     * @param version : 版本信息
     * @return std::string
     */
    std::string PackVersionInfoMessage(const robot_version_info_t &version);

    /**
     * @brief 打包雷达点云数据
     * @param points : 雷达点
     * @return std::string
     */
    std::string PackLidarPointsDataMessage(const std::vector<location_pose_t> &points);

    void PraseHeartBeatMessage(const char* msg, int len);

private:
    uint64_t _heartbeat_pingtime;   // ms
    uint64_t _send_heartbeat_time;  // ms
    uint64_t _last_recv_heartbeart_time;  // 最后一次接收心跳回复的时间, ms
};

} // namespace ubt

#endif // !__UBT_MESSAGE_MANAGER__

